/**
 * 文件工具
 * @author luguoxiang
 * @date 2021-09-07
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
// @ts-ignore
import { stringToBytes } from './data';
import { toMd5 } from './crypto';
import { serverUrl, tokenName } from '@/config';
import { getToken } from './token';

const fileRoot = `${window.location.origin}/`;
/**
 * 识别 lg-soar 系统文件
 * @type {RegExp}
 */
const regExp = /\/\d{4}\/\d{2}\/\d{2}\/[0-9A-Fa-f]{32}_\d+\./;

/**
 * 文件大小单位
 */
const SIZE_UNIT: string[] = ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB', 'BB', 'NB', 'DB', 'CB', 'XB'];

/**
 * 压缩级别
 * @type {string[]}
 */
export type ThumbnailSizeEnum = 's' | 'm' | 'l';

/**
 * 压缩级别
 * @type {string[]}
 */
export type IMG_COMPRESS_LEVEL = 'mini' | 'small' | 'medium' | 'large';
/**
 * 判断图片类型正则
 */
const IMG_REG_EXP = /^image\/.+/;

/**
 * 文件扩展名
 */
const EXTENSIONS = {
  img: [
    'bmp',
    'jpg',
    'png',
    'tif',
    'gif',
    'pcx',
    'tga',
    'exif',
    'fpx',
    'svg',
    'psd',
    'cdr',
    'pcd',
    'dxf',
    'ufo',
    'eps',
    'ai',
    'raw',
    'WMF',
    'webp',
    'avif',
    'apng',
  ],
  video: ['mp4', 'mpeg', '3gp', 'avi', 'ts', 'mkv', 'wmv', 'mpg', 'mov', 'rm', 'ram', 'swf', 'flv'],
  audio: [
    'mp3',
    'aac',
    'wav',
    'wma',
    'cda',
    'flac',
    'm4a',
    'mid',
    'mka',
    'mp2',
    'mpa',
    'mpc',
    'ape',
    'ofr',
    'ogg',
    'ra',
    'wv',
    'tta',
    'ac3',
    'dts',
  ],
  word: ['doc', 'docx', 'pdf', 'txt'],
  excel: ['xls', 'xlsx'],
  ppt: ['ppt', 'pptx'],
  zip: ['zip', '.7z', 'rar'],
};

/**
 * 获取文件扩展名
 * @param filename
 */
export function getFileExtension(filename: string): string {
  const index = filename.lastIndexOf('.');
  return filename.substring(index + 1);
}

export function getFileTypeByExt(filename: string): string {
  const extension = getFileExtension(filename);
  for (const type in EXTENSIONS) {
    const exts = EXTENSIONS[type];
    for (const ext of exts) {
      if (ext === extension) {
        return type;
      }
    }
  }
  return 'other';
}

/**
 * 根据文件名称判断是否是图片
 * @param fileName
 */
export function isImgByName(fileName: string) {
  const extension = getFileExtension(fileName);
  return EXTENSIONS.img.includes(extension.toLowerCase());
}

/**
 * 根据文件类型判断是否是图片
 * @param fileType
 */
export function isImgByType(fileType: string) {
  return IMG_REG_EXP.test(fileType);
}

/**
 * 获取文件访问地址
 * @param url 原路径
 * @param level 压缩级别（仅lg-soar文件系统支持）
 * @returns {string|*}
 */
export function getFileAccessUrl(url: string, level?: ThumbnailSizeEnum): string {
  if (!url || url.startsWith('http') || url.startsWith('blob:') || url.startsWith('data:')) {
    return url;
  }
  if (level) {
    const us = url.split('?');
    url = `${serverUrl}/general/file/${us[0]}`;
    return `${url}?s=${level}&${us[1]}`;
  }
  return `${serverUrl}/general/file/${url}`;
}

/**
 * 文件访问授权地址(加授权 token 参数)
 * @param url
 * @param level
 * @returns {string}
 */
export function getFileAccessAuthUrl(url: string, level?: ThumbnailSizeEnum): string {
  if (!url || url.startsWith('http') || url.startsWith('blob:') || url.startsWith('data:')) {
    return url;
  }
  const us = url.split('?');
  url = `${serverUrl}/general/file/${us[0]}`;
  if (level) {
    return `${url}?s=${level}&${tokenName}=${getToken()}&${us[1]}`;
  }
  return `${url}?${tokenName}=${getToken()}&${us[1]}`;
}

/**
 * 格式化大小表示
 * @param {number|string}size
 */
export function sizeFormat(size: number | string): string {
  // TODO 需要修改
  if (size === null || size === undefined) {
    return '';
  }
  if (typeof size === 'string') {
    size = sizeParse(size);
  }
  if (size < 1024) {
    return `${size}B`;
  }
  for (const x of SIZE_UNIT) {
    size /= 1024;
    if (size < 1024) {
      if (size < 10) {
        return size.toFixed(2) + x;
      }
      if (size < 100) {
        return size.toFixed(1) + x;
      }
      return size.toFixed(0) + x;
    }
  }
  return '无穷大';
}

/**
 * 解析格式化表示
 * @param {string|number}size
 */
export function sizeParse(size: string | number): number {
  // TODO 需要修改
  if (typeof size === 'string') {
    size = size.trim().toUpperCase();
    const index = size.length - 2;
    let num = 1;
    for (const x of SIZE_UNIT) {
      num *= 1024;
      if (size.indexOf(x) === index) {
        return Math.round(Number(size.replace(x, ''))) * num;
      }
    }
    size = size.replace('B', '');
  }
  return Math.round(Number(size));
}

/**
 * 格式化文件大小
 * @param {Number} value
 * @returns {String}
 */
export function fileSize(value: number): string {
  if (value < 1024) {
    return `${value}B`;
  }
  let ys = `${value % 1024}B`;
  value = Math.floor(value / 1024);
  if (value < 1024) {
    return `${value}K ${ys}`;
  }
  ys = `${value % 1024}K ${ys}`;
  value = Math.floor(value / 1024);
  if (value < 1024) {
    return `${value}M ${ys}`;
  }
  ys = `${value % 1024}M ${ys}`;
  value = Math.floor(value / 1024);
  if (value < 1024) {
    return `${value}G ${ys}`;
  }
  ys = `${value % 1024}G ${ys}`;
  value = Math.floor(value / 1024);
  if (value < 1024) {
    return `${value}T ${ys}`;
  }
  ys = `${value % 1024}T ${ys}`;
  value = Math.floor(value / 1024);
  return `${value}P ${ys}`;
}
